
package source;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.StringTokenizer;

/**
 *
 * @author Miguel
 */
public class ThreadCertificarPeer extends Thread {

    public final static long TAM_PAQUETES = 512;
    private Socket sCliente;

    public ThreadCertificarPeer(Socket socket) {
        this.sCliente = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = sCliente.getInputStream();
            OutputStream os = sCliente.getOutputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String mensaje = br.readLine();
            File rutaArchivos = new File("../temp/Certificados/");
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm.ss,SSS");
            if (mensaje.startsWith("SOLICITO_CERTIFICADO")) {

                StringTokenizer st = new StringTokenizer(mensaje, ";");
                st.nextToken();
                String critPeer = st.nextToken();
                System.out.println("Se está buscando el archivo del peer: " + critPeer);
                File newarchivo = new File("../temp/Certificados/" + critPeer + ".p12");
                if (newarchivo.exists()) {
                    enviarArchivo(newarchivo, sCliente);
                } else {
                    String rta = "NOEXISTE_CERTIFICADO";
                    PrintWriter pw = new PrintWriter(os, true);
                    pw.println(rta);
                    sCliente.close();
                }
            }
        }
        catch(Exception e)
        {
            
        }
    }
    
    private void enviarArchivo(File archivoAMandar, Socket sCliente) {
        try {
            OutputStream clienteOut = sCliente.getOutputStream();
            InputStream clienteIn = sCliente.getInputStream();
            String rta = "CERTIFICADO_EXISTE"+";" + archivoAMandar.length();
            PrintWriter writeenvio = new PrintWriter(clienteOut, true);
            writeenvio.println(rta);
            FileInputStream fis = new FileInputStream(archivoAMandar);

            long tamArchivo = archivoAMandar.length();
            if (tamArchivo < TAM_PAQUETES) {
                byte[] menor = new byte[(int) tamArchivo];
                fis.read(menor);
                clienteOut.write(menor);
            } else {

                long numeroPaquetes = tamArchivo / TAM_PAQUETES;
                for (int i = 0; i < numeroPaquetes; i++) {
                    byte[] paq = new byte[(int) TAM_PAQUETES];
                    fis.read(paq);
                    clienteOut.write(paq);
                }
                long loQuefalta = archivoAMandar.length() - (numeroPaquetes * TAM_PAQUETES);
                if (loQuefalta > 0) {
                    byte[] falta = new byte[(int) loQuefalta];
                    fis.read(falta);
                    clienteOut.write(falta);

                }
            }
            fis.close();
            sCliente.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
